﻿using System;


namespace ConsoleApp
{
    // 面向对象
    // 结构是值类型，类是引用类型。结构分配在栈上，而类分配在堆上。对于小型数据结构，使用结构可以更有效，因为它避免了堆分配和垃圾收集的开销。
    internal class DemoClass
    {
        //析构函数由垃圾回收器在确定对象不再被引用时自动调用的。主要用于清理非托管资源，例如文件句柄或数据库连接
        ~DemoClass()  
        {  
            Console.WriteLine("Cleanup unmanaged resources");
        }  
        // 主动清理
        public void Clear()
        {
            var c = new DemoClass();
            // 通过将对象设置为null，也可以间接触发析构函数
            c = null;
 
            // 强制进行一次垃圾回收
            GC.Collect();
        }
        
        // 封装
        public void EncapsulationTest()
        {
            // public :公开的公共的
            // private：私有的，只能在当前类的内部访问
            // protected：受保护的，只能在当前类的内部以及该类的子类中访问。
            // internal：只能在当前项目中访问。在同一个项目中，internal和public的权限是一样。
            // protected internal：protected+internal

            // 1)、能够修饰类的访问修饰符只有两个：public、internal。
            // 2)、可访问性不一致。
            // 子类的访问权限不能高于父类的访问权限，会暴漏父类的成员。
        }

        // 继承
        public void InheritanceTest()
        {
            /*
             里氏转换：
             * 1、子类可以赋值给父类(如果有一个方法需要一个父类作为参数，我们可以传第一个子类对象)
             * 2、如果父类中装的是子类对象，则可以将这个父类强转为子类对象
             */
            //Person p = new Student();
            ////is as
            //Student ss = p as Student;
            //ss.StudentSayHello();
            //Console.ReadKey();
            //if (p is Student)
            //{
            //    ((Student)p).StudentSayHello();
            //}
            //else
            //{
            //    Console.WriteLine("转换失败");
            //}
            //Console.ReadKey();
        }

        // 多态
        //概念:让一个对象能够表现出多种的状态(类型)
        //实现多态的3种手段：1、虚方法 2、抽象类 3、接口
        public void PolymorphismTest()
        {

        }

        // 抽象类
        public void AbstractTest()
        {

        }

        // 接口
        public void InterfaceTest()
        {

        }

        public void test()
        {
            List<dynamic> list = new List<dynamic>();

            // 添加一些元素到列表中
            list.Add(new { name = "1" });
            list.Add(new { name = "2" });
            list.Add(new { name = "3" });

            // 遍历列表并打印每个元素
            foreach (dynamic item in list)
            {
                Console.WriteLine(item.name);
            }
        }
    }

    //public class Person
    //{
    //    private string _name;
    //    public string Name
    //    {
    //        get { return _name; }
    //        set { _name = value; }
    //    }

    //    public int Age;

    //    //public Person(string name)
    //    //{
    //    //    this.Name = name;
    //    //}

    //    public virtual void SayHello()
    //    {
    //        Console.WriteLine("我是人类");
    //    }
    //}

    //public class Student : Person
    //{
    //    public override void SayHello()
    //    {
    //        Console.WriteLine("我是学生");
    //    }
    //}
}
